source('../settings/settings.R')
source('commonFunctions.R')
persons <- SELECTED_SUBJECTS

all_Drive1 <- read.csv('..//data/processed/distancewise/TT1_Drive_1_30m_30m.csv')
all_Drive1$Subject <- as.factor(all_Drive1$Subject)
all_Drive1$logPerspiration <- log(all_Drive1$Perspiration)
mean_pp <- vector(mode="list", length=length(persons)) 
names(mean_pp) <- persons

std_pp <- vector(mode="list", length=length(persons)) 
names(std_pp) <- persons

# Segments
mean_pp_seg0 <- vector(mode="list", length=length(persons)) 
names(mean_pp_seg0) <- persons
mean_pp_seg1 <- vector(mode="list", length=length(persons)) 
names(mean_pp_seg1) <- persons
mean_pp_seg2 <- vector(mode="list", length=length(persons)) 
names(mean_pp_seg2) <- persons
mean_pp_seg3 <- vector(mode="list", length=length(persons)) 
names(mean_pp_seg3) <- persons
mean_pp_seg4 <- vector(mode="list", length=length(persons)) 
names(mean_pp_seg4) <- persons


for(p in persons) {
  pData <- all_Drive1[(all_Drive1$Subject==as.integer(p) | all_Drive1$Subject==p),]
  pData_act1 <- pData[pData$Activity == 1,]
  
  if(p == "41") {
    # This subjest has suspecious PP in the last phase (Phase = 4)
    pData_seg0 <- pData[pData$Phase==0 & pData$Time <= 370,]
  } else {
    pData_seg0 <- pData[pData$Phase==0,]
  }
  
  pData_seg1 <- pData[pData$Phase==1 & pData$Activity==1 & pData$Time < 110,]
  pData_seg2 <- pData[pData$Phase==2 & pData$Activity==1 & pData$Time < 250,]
  pData_seg3 <- pData[pData$Phase==3 & pData$Activity==1 & pData$Time < 350,]
  pData_seg4 <- pData[pData$Phase==4 & pData$Activity==1,]
  
  if(p == "41") {
    # This subjest has suspecious PP in the last phase (Phase = 4)
    mean_pp[[p]] <- mean(pData_act1[pData_act1$Time <= 370,]$ppLogNormalized)
  } else {
    mean_pp[[p]] <- mean(pData_act1$ppLogNormalized)
  }
  
  std_pp[[p]] <- sd(pData$ppLogNormalized)
  mean_pp_seg0[[p]] <- mean(pData_seg0$ppLogNormalized)
  mean_pp_seg1[[p]] <- mean(pData_seg1$ppLogNormalized)
  mean_pp_seg2[[p]] <- mean(pData_seg2$ppLogNormalized)
  mean_pp_seg3[[p]] <- mean(pData_seg3$ppLogNormalized)
  
  if (p == "41") {
    mean_pp_seg4[[p]] <- mean_pp[[p]]
  } else {
    mean_pp_seg4[[p]] <- mean(pData_seg4$ppLogNormalized)
  }
}
plt_AllAcc <- vector(mode="list", length=length(persons)) 
names(plt_AllAcc) <- persons

COLOR_ACC = "#02A3C8"
COLOR_PP = "#F28E8E"
COLOR_BRAKE = "#888888"

y1 <- list(
  tickfont = list(color = COLOR_ACC),
  title="Degree",
  range=c(0, max(all_Drive1$Acceleration))
)
y2 <- list(
  tickfont = list(color = COLOR_PP),
  overlaying = "y",
  side = "right",
  title = "Log Perspiration",
  showgrid = FALSE,
  range=c(-max(all_Drive1$ppLogNormalized), max(all_Drive1$ppLogNormalized))
)

for (p in persons) {
  pData <- all_Drive1[all_Drive1$Subject==as.integer(p) | all_Drive1$Subject==p,]
  
  pData_seg0 <- pData[pData$Phase==0,]
  pData_seg1 <- pData[pData$Phase==1 & pData$Activity==1 & pData$Time < 110,]
  pData_seg2 <- pData[pData$Phase==2 & pData$Activity==1 & pData$Time < 250,]
  pData_seg3 <- pData[pData$Phase==3 & pData$Activity==1 & pData$Time < 350,]
  pData_seg4 <- pData[pData$Phase==4 & pData$Activity==1,]
  
  plot_Acc <- plot_ly(pData, x = ~Time, height=400, width=900) %>%
    # add_trace(name="Acceleration", y = ~Acceleration, type = 'scatter', mode = 'lines', line=list(width=1.5, color=COLOR_ACC)) %>% 
    add_trace(name="PP", y = ~ppLogNormalized, type = 'scatter', mode = 'lines', connectgaps=F, line=list(width=1.5, color=COLOR_PP), yaxis = "y2") %>%
    add_segments(x = min(pData$Time), xend = max(pData$Time), y = mean_pp[[p]], yend = mean_pp[[p]],
                           yaxis = "y2", name="Avg. PP (straight)",
                           line=list(color="darkgray", dash = 'dot')) %>%
    add_segments(x = min(pData$Time), xend = max(pData$Time), y = mean_pp_seg0[[p]], yend = mean_pp_seg0[[p]], 
                           yaxis = "y2", name="Avg. PP (turning)",
                           line=list(color="black", dash = 'dot')) %>%
    add_segments(x = min(pData_seg1$Time), xend = max(pData_seg1$Time), y = mean_pp_seg1[[p]], yend = mean_pp_seg1[[p]], 
                           yaxis = "y2", name="Avg. PP (1st part)",
                           line=list(color="red", dash = 'dot')) %>%
    add_segments(x = min(pData_seg2$Time), xend = max(pData_seg2$Time), y = mean_pp_seg2[[p]], yend = mean_pp_seg2[[p]], 
                           yaxis = "y2", name="Avg. PP (2nd part)",
                           line=list(color="green", dash = 'dot')) %>%
    add_segments(x = min(pData_seg3$Time), xend = max(pData_seg3$Time), y = mean_pp_seg3[[p]], yend = mean_pp_seg3[[p]], 
                           yaxis = "y2", name="Avg. PP (3rd part)",
                           line=list(color="blue", dash = 'dot')) %>%
    add_segments(x = min(pData_seg4$Time), xend = max(pData_seg4$Time), y = mean_pp_seg4[[p]], yend = mean_pp_seg4[[p]], 
                           yaxis = "y2", name="Avg. PP (4th part)",
                           line=list(color="purple", dash = 'dot')) %>%
    layout(
      title=paste0("Subject #", p), 
      xaxis=list(title="Time [s]", range=c(0)), 
      yaxis=y1, 
      yaxis2=y2, 
      margin = list(l = 50, r = 50, b = 50, t = 50, pad = 4),
      legend = list(x = 0.5, xanchor = "center", y = -0.4, bgcolor = "rgba(0,0,0,0)", title="Metric", orientation = "h"),
      autosize = F
    )
  
  plt_AllAcc[[p]] <- plot_Acc
}
no non-missing arguments to min; returning Infno non-missing arguments to max; returning -Inf
htmltools::tagList(plt_AllAcc)
NUMBER_OF_CLUSTERS = 3

color_darkpink = "#e75480"
CLUSTER_BRANCH_COLORS <- c("blue", "darkred", color_darkpink, "black")[1:NUMBER_OF_CLUSTERS]
CLUSTER_LABEL_COLORS <- c("blue", "darkred", color_darkpink, "black")[1:NUMBER_OF_CLUSTERS]


dfPP <- as.data.frame(cbind(
                            unlist(mean_pp), 
                            unlist(std_pp), 
                            unlist(mean_pp_seg0), 
                            unlist(mean_pp_seg1), 
                            unlist(mean_pp_seg2), 
                            unlist(mean_pp_seg3), 
                            unlist(mean_pp_seg4)))

names(dfPP) <- c("MeanPP", "StdPP", "MeanPP_Seg0", "MeanPP_Seg1", "MeanPP_Seg2", "MeanPP_Seg3", "MeanPP_Seg4")
behavioralMatrixClustering <- as.matrix(dfPP)

distMatrix <- dist(behavioralMatrixClustering)
hresults <- distMatrix %>% hclust

hc <- hresults %>% 
      as.dendrogram %>%
      set("nodes_cex", NUMBER_OF_CLUSTERS) %>%
      set("labels_col", value = CLUSTER_LABEL_COLORS, k=NUMBER_OF_CLUSTERS) %>%
      # set("leaves_pch", 19) %>%
      # set("leaves_col", value = c("gray"), k=NUMBER_OF_CLUSTERS) %>%    
      set("branches_k_color", value=CLUSTER_BRANCH_COLORS, k=NUMBER_OF_CLUSTERS)

plot(hc)
legend("topright", 
     title="Drive=Cognitive \nHierachical Clustering",
     legend = c("Group 1", "Group 2", "Group 3"), 
     col = c("darkred", "pink" , "blue"),
     pch = c(20,20,20), bty = "n",  pt.cex = 1.5, cex = 0.8 , 
     text.col = "black", horiz = FALSE, inset = c(0.4, 0.1))

# Store analysis data
fPath <- str_interp("../data/processed/analysis/TT1_Drive_1_PP.csv")
dfx <- dfPP
dfx <- cbind(persons, dfx)
names(dfx) <- c("Subject", names(dfPP))
write.csv(dfx, fPath, row.names = F)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CnNvdXJjZSgnLi4vc2V0dGluZ3Mvc2V0dGluZ3MuUicpCnNvdXJjZSgnY29tbW9uRnVuY3Rpb25zLlInKQpgYGAKCmBgYHtyfQpwZXJzb25zIDwtIFNFTEVDVEVEX1NVQkpFQ1RTCgphbGxfRHJpdmUxIDwtIHJlYWQuY3N2KCcuLi8vZGF0YS9wcm9jZXNzZWQvZGlzdGFuY2V3aXNlL1RUMV9Ecml2ZV8xXzMwbV8zMG0uY3N2JykKYWxsX0RyaXZlMSRTdWJqZWN0IDwtIGFzLmZhY3RvcihhbGxfRHJpdmUxJFN1YmplY3QpCmFsbF9Ecml2ZTEkbG9nUGVyc3BpcmF0aW9uIDwtIGxvZyhhbGxfRHJpdmUxJFBlcnNwaXJhdGlvbikKYGBgCgoKYGBge3J9Cm1lYW5fcHAgPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMobWVhbl9wcCkgPC0gcGVyc29ucwoKc3RkX3BwIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKHN0ZF9wcCkgPC0gcGVyc29ucwoKIyBTZWdtZW50cwptZWFuX3BwX3NlZzAgPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMobWVhbl9wcF9zZWcwKSA8LSBwZXJzb25zCm1lYW5fcHBfc2VnMSA8LSB2ZWN0b3IobW9kZT0ibGlzdCIsIGxlbmd0aD1sZW5ndGgocGVyc29ucykpIApuYW1lcyhtZWFuX3BwX3NlZzEpIDwtIHBlcnNvbnMKbWVhbl9wcF9zZWcyIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKG1lYW5fcHBfc2VnMikgPC0gcGVyc29ucwptZWFuX3BwX3NlZzMgPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMobWVhbl9wcF9zZWczKSA8LSBwZXJzb25zCm1lYW5fcHBfc2VnNCA8LSB2ZWN0b3IobW9kZT0ibGlzdCIsIGxlbmd0aD1sZW5ndGgocGVyc29ucykpIApuYW1lcyhtZWFuX3BwX3NlZzQpIDwtIHBlcnNvbnMKCgpmb3IocCBpbiBwZXJzb25zKSB7CiAgcERhdGEgPC0gYWxsX0RyaXZlMVsoYWxsX0RyaXZlMSRTdWJqZWN0PT1hcy5pbnRlZ2VyKHApIHwgYWxsX0RyaXZlMSRTdWJqZWN0PT1wKSxdCiAgcERhdGFfYWN0MSA8LSBwRGF0YVtwRGF0YSRBY3Rpdml0eSA9PSAxLF0KICAKICBpZihwID09ICI0MSIpIHsKICAgICMgVGhpcyBzdWJqZXN0IGhhcyBzdXNwZWNpb3VzIFBQIGluIHRoZSBsYXN0IHBoYXNlIChQaGFzZSA9IDQpCiAgICBwRGF0YV9zZWcwIDwtIHBEYXRhW3BEYXRhJFBoYXNlPT0wICYgcERhdGEkVGltZSA8PSAzNzAsXQogIH0gZWxzZSB7CiAgICBwRGF0YV9zZWcwIDwtIHBEYXRhW3BEYXRhJFBoYXNlPT0wLF0KICB9CiAgCiAgcERhdGFfc2VnMSA8LSBwRGF0YVtwRGF0YSRQaGFzZT09MSAmIHBEYXRhJEFjdGl2aXR5PT0xICYgcERhdGEkVGltZSA8IDExMCxdCiAgcERhdGFfc2VnMiA8LSBwRGF0YVtwRGF0YSRQaGFzZT09MiAmIHBEYXRhJEFjdGl2aXR5PT0xICYgcERhdGEkVGltZSA8IDI1MCxdCiAgcERhdGFfc2VnMyA8LSBwRGF0YVtwRGF0YSRQaGFzZT09MyAmIHBEYXRhJEFjdGl2aXR5PT0xICYgcERhdGEkVGltZSA8IDM1MCxdCiAgcERhdGFfc2VnNCA8LSBwRGF0YVtwRGF0YSRQaGFzZT09NCAmIHBEYXRhJEFjdGl2aXR5PT0xLF0KICAKICBpZihwID09ICI0MSIpIHsKICAgICMgVGhpcyBzdWJqZXN0IGhhcyBzdXNwZWNpb3VzIFBQIGluIHRoZSBsYXN0IHBoYXNlIChQaGFzZSA9IDQpCiAgICBtZWFuX3BwW1twXV0gPC0gbWVhbihwRGF0YV9hY3QxW3BEYXRhX2FjdDEkVGltZSA8PSAzNzAsXSRwcExvZ05vcm1hbGl6ZWQpCiAgfSBlbHNlIHsKICAgIG1lYW5fcHBbW3BdXSA8LSBtZWFuKHBEYXRhX2FjdDEkcHBMb2dOb3JtYWxpemVkKQogIH0KICAKICBzdGRfcHBbW3BdXSA8LSBzZChwRGF0YSRwcExvZ05vcm1hbGl6ZWQpCiAgbWVhbl9wcF9zZWcwW1twXV0gPC0gbWVhbihwRGF0YV9zZWcwJHBwTG9nTm9ybWFsaXplZCkKICBtZWFuX3BwX3NlZzFbW3BdXSA8LSBtZWFuKHBEYXRhX3NlZzEkcHBMb2dOb3JtYWxpemVkKQogIG1lYW5fcHBfc2VnMltbcF1dIDwtIG1lYW4ocERhdGFfc2VnMiRwcExvZ05vcm1hbGl6ZWQpCiAgbWVhbl9wcF9zZWczW1twXV0gPC0gbWVhbihwRGF0YV9zZWczJHBwTG9nTm9ybWFsaXplZCkKICAKICBpZiAocCA9PSAiNDEiKSB7CiAgICBtZWFuX3BwX3NlZzRbW3BdXSA8LSBtZWFuX3BwW1twXV0KICB9IGVsc2UgewogICAgbWVhbl9wcF9zZWc0W1twXV0gPC0gbWVhbihwRGF0YV9zZWc0JHBwTG9nTm9ybWFsaXplZCkKICB9Cn0KCmBgYAoKYGBge3J9CnBsdF9BbGxBY2MgPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMocGx0X0FsbEFjYykgPC0gcGVyc29ucwoKQ09MT1JfQUNDID0gIiMwMkEzQzgiCkNPTE9SX1BQID0gIiNGMjhFOEUiCkNPTE9SX0JSQUtFID0gIiM4ODg4ODgiCgp5MSA8LSBsaXN0KAogIHRpY2tmb250ID0gbGlzdChjb2xvciA9IENPTE9SX0FDQyksCiAgdGl0bGU9IkRlZ3JlZSIsCiAgcmFuZ2U9YygwLCBtYXgoYWxsX0RyaXZlMSRBY2NlbGVyYXRpb24pKQopCnkyIDwtIGxpc3QoCiAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gQ09MT1JfUFApLAogIG92ZXJsYXlpbmcgPSAieSIsCiAgc2lkZSA9ICJyaWdodCIsCiAgdGl0bGUgPSAiTG9nIFBlcnNwaXJhdGlvbiIsCiAgc2hvd2dyaWQgPSBGQUxTRSwKICByYW5nZT1jKC1tYXgoYWxsX0RyaXZlMSRwcExvZ05vcm1hbGl6ZWQpLCBtYXgoYWxsX0RyaXZlMSRwcExvZ05vcm1hbGl6ZWQpKQopCgpmb3IgKHAgaW4gcGVyc29ucykgewogIHBEYXRhIDwtIGFsbF9Ecml2ZTFbYWxsX0RyaXZlMSRTdWJqZWN0PT1hcy5pbnRlZ2VyKHApIHwgYWxsX0RyaXZlMSRTdWJqZWN0PT1wLF0KICAKICBwRGF0YV9zZWcwIDwtIHBEYXRhW3BEYXRhJFBoYXNlPT0wLF0KICBwRGF0YV9zZWcxIDwtIHBEYXRhW3BEYXRhJFBoYXNlPT0xICYgcERhdGEkQWN0aXZpdHk9PTEgJiBwRGF0YSRUaW1lIDwgMTEwLF0KICBwRGF0YV9zZWcyIDwtIHBEYXRhW3BEYXRhJFBoYXNlPT0yICYgcERhdGEkQWN0aXZpdHk9PTEgJiBwRGF0YSRUaW1lIDwgMjUwLF0KICBwRGF0YV9zZWczIDwtIHBEYXRhW3BEYXRhJFBoYXNlPT0zICYgcERhdGEkQWN0aXZpdHk9PTEgJiBwRGF0YSRUaW1lIDwgMzUwLF0KICBwRGF0YV9zZWc0IDwtIHBEYXRhW3BEYXRhJFBoYXNlPT00ICYgcERhdGEkQWN0aXZpdHk9PTEsXQogIAogIHBsb3RfQWNjIDwtIHBsb3RfbHkocERhdGEsIHggPSB+VGltZSwgaGVpZ2h0PTQwMCwgd2lkdGg9OTAwKSAlPiUKICAgICMgYWRkX3RyYWNlKG5hbWU9IkFjY2VsZXJhdGlvbiIsIHkgPSB+QWNjZWxlcmF0aW9uLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywgbGluZT1saXN0KHdpZHRoPTEuNSwgY29sb3I9Q09MT1JfQUNDKSkgJT4lIAogICAgYWRkX3RyYWNlKG5hbWU9IlBQIiwgeSA9IH5wcExvZ05vcm1hbGl6ZWQsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnLCBjb25uZWN0Z2Fwcz1GLCBsaW5lPWxpc3Qod2lkdGg9MS41LCBjb2xvcj1DT0xPUl9QUCksIHlheGlzID0gInkyIikgJT4lCiAgICBhZGRfc2VnbWVudHMoeCA9IG1pbihwRGF0YSRUaW1lKSwgeGVuZCA9IG1heChwRGF0YSRUaW1lKSwgeSA9IG1lYW5fcHBbW3BdXSwgeWVuZCA9IG1lYW5fcHBbW3BdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeWF4aXMgPSAieTIiLCBuYW1lPSJBdmcuIFBQIChzdHJhaWdodCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPWxpc3QoY29sb3I9ImRhcmtncmF5IiwgZGFzaCA9ICdkb3QnKSkgJT4lCiAgICBhZGRfc2VnbWVudHMoeCA9IG1pbihwRGF0YSRUaW1lKSwgeGVuZCA9IG1heChwRGF0YSRUaW1lKSwgeSA9IG1lYW5fcHBfc2VnMFtbcF1dLCB5ZW5kID0gbWVhbl9wcF9zZWcwW1twXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICB5YXhpcyA9ICJ5MiIsIG5hbWU9IkF2Zy4gUFAgKHR1cm5pbmcpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZT1saXN0KGNvbG9yPSJibGFjayIsIGRhc2ggPSAnZG90JykpICU+JQogICAgYWRkX3NlZ21lbnRzKHggPSBtaW4ocERhdGFfc2VnMSRUaW1lKSwgeGVuZCA9IG1heChwRGF0YV9zZWcxJFRpbWUpLCB5ID0gbWVhbl9wcF9zZWcxW1twXV0sIHllbmQgPSBtZWFuX3BwX3NlZzFbW3BdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gInkyIiwgbmFtZT0iQXZnLiBQUCAoMXN0IHBhcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZT1saXN0KGNvbG9yPSJyZWQiLCBkYXNoID0gJ2RvdCcpKSAlPiUKICAgIGFkZF9zZWdtZW50cyh4ID0gbWluKHBEYXRhX3NlZzIkVGltZSksIHhlbmQgPSBtYXgocERhdGFfc2VnMiRUaW1lKSwgeSA9IG1lYW5fcHBfc2VnMltbcF1dLCB5ZW5kID0gbWVhbl9wcF9zZWcyW1twXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICB5YXhpcyA9ICJ5MiIsIG5hbWU9IkF2Zy4gUFAgKDJuZCBwYXJ0KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU9bGlzdChjb2xvcj0iZ3JlZW4iLCBkYXNoID0gJ2RvdCcpKSAlPiUKICAgIGFkZF9zZWdtZW50cyh4ID0gbWluKHBEYXRhX3NlZzMkVGltZSksIHhlbmQgPSBtYXgocERhdGFfc2VnMyRUaW1lKSwgeSA9IG1lYW5fcHBfc2VnM1tbcF1dLCB5ZW5kID0gbWVhbl9wcF9zZWczW1twXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICB5YXhpcyA9ICJ5MiIsIG5hbWU9IkF2Zy4gUFAgKDNyZCBwYXJ0KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU9bGlzdChjb2xvcj0iYmx1ZSIsIGRhc2ggPSAnZG90JykpICU+JQogICAgYWRkX3NlZ21lbnRzKHggPSBtaW4ocERhdGFfc2VnNCRUaW1lKSwgeGVuZCA9IG1heChwRGF0YV9zZWc0JFRpbWUpLCB5ID0gbWVhbl9wcF9zZWc0W1twXV0sIHllbmQgPSBtZWFuX3BwX3NlZzRbW3BdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gInkyIiwgbmFtZT0iQXZnLiBQUCAoNHRoIHBhcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZT1saXN0KGNvbG9yPSJwdXJwbGUiLCBkYXNoID0gJ2RvdCcpKSAlPiUKICAgIGxheW91dCgKICAgICAgdGl0bGU9cGFzdGUwKCJTdWJqZWN0ICMiLCBwKSwgCiAgICAgIHhheGlzPWxpc3QodGl0bGU9IlRpbWUgW3NdIiwgcmFuZ2U9YygwKSksIAogICAgICB5YXhpcz15MSwgCiAgICAgIHlheGlzMj15MiwgCiAgICAgIG1hcmdpbiA9IGxpc3QobCA9IDUwLCByID0gNTAsIGIgPSA1MCwgdCA9IDUwLCBwYWQgPSA0KSwKICAgICAgbGVnZW5kID0gbGlzdCh4ID0gMC41LCB4YW5jaG9yID0gImNlbnRlciIsIHkgPSAtMC40LCBiZ2NvbG9yID0gInJnYmEoMCwwLDAsMCkiLCB0aXRsZT0iTWV0cmljIiwgb3JpZW50YXRpb24gPSAiaCIpLAogICAgICBhdXRvc2l6ZSA9IEYKICAgICkKICAKICBwbHRfQWxsQWNjW1twXV0gPC0gcGxvdF9BY2MKfQoKCmh0bWx0b29sczo6dGFnTGlzdChwbHRfQWxsQWNjKQpgYGAKCgpgYGB7cn0KTlVNQkVSX09GX0NMVVNURVJTID0gMwoKY29sb3JfZGFya3BpbmsgPSAiI2U3NTQ4MCIKQ0xVU1RFUl9CUkFOQ0hfQ09MT1JTIDwtIGMoImJsdWUiLCAiZGFya3JlZCIsIGNvbG9yX2RhcmtwaW5rLCAiYmxhY2siKVsxOk5VTUJFUl9PRl9DTFVTVEVSU10KQ0xVU1RFUl9MQUJFTF9DT0xPUlMgPC0gYygiYmx1ZSIsICJkYXJrcmVkIiwgY29sb3JfZGFya3BpbmssICJibGFjayIpWzE6TlVNQkVSX09GX0NMVVNURVJTXQoKCmRmUFAgPC0gYXMuZGF0YS5mcmFtZShjYmluZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChtZWFuX3BwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3Qoc3RkX3BwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobWVhbl9wcF9zZWcwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobWVhbl9wcF9zZWcxKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobWVhbl9wcF9zZWcyKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobWVhbl9wcF9zZWczKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobWVhbl9wcF9zZWc0KSkpCgpuYW1lcyhkZlBQKSA8LSBjKCJNZWFuUFAiLCAiU3RkUFAiLCAiTWVhblBQX1NlZzAiLCAiTWVhblBQX1NlZzEiLCAiTWVhblBQX1NlZzIiLCAiTWVhblBQX1NlZzMiLCAiTWVhblBQX1NlZzQiKQpiZWhhdmlvcmFsTWF0cml4Q2x1c3RlcmluZyA8LSBhcy5tYXRyaXgoZGZQUCkKCmRpc3RNYXRyaXggPC0gZGlzdChiZWhhdmlvcmFsTWF0cml4Q2x1c3RlcmluZykKaHJlc3VsdHMgPC0gZGlzdE1hdHJpeCAlPiUgaGNsdXN0CgpoYyA8LSBocmVzdWx0cyAlPiUgCiAgICAgIGFzLmRlbmRyb2dyYW0gJT4lCiAgICAgIHNldCgibm9kZXNfY2V4IiwgTlVNQkVSX09GX0NMVVNURVJTKSAlPiUKICAgICAgc2V0KCJsYWJlbHNfY29sIiwgdmFsdWUgPSBDTFVTVEVSX0xBQkVMX0NPTE9SUywgaz1OVU1CRVJfT0ZfQ0xVU1RFUlMpICU+JQogICAgICAjIHNldCgibGVhdmVzX3BjaCIsIDE5KSAlPiUKICAgICAgIyBzZXQoImxlYXZlc19jb2wiLCB2YWx1ZSA9IGMoImdyYXkiKSwgaz1OVU1CRVJfT0ZfQ0xVU1RFUlMpICU+JSAgICAKICAgICAgc2V0KCJicmFuY2hlc19rX2NvbG9yIiwgdmFsdWU9Q0xVU1RFUl9CUkFOQ0hfQ09MT1JTLCBrPU5VTUJFUl9PRl9DTFVTVEVSUykKCnBsb3QoaGMpCmxlZ2VuZCgidG9wcmlnaHQiLCAKICAgICB0aXRsZT0iRHJpdmU9Q29nbml0aXZlIFxuSGllcmFjaGljYWwgQ2x1c3RlcmluZyIsCiAgICAgbGVnZW5kID0gYygiR3JvdXAgMSIsICJHcm91cCAyIiwgIkdyb3VwIDMiKSwgCiAgICAgY29sID0gYygiZGFya3JlZCIsICJwaW5rIiAsICJibHVlIiksCiAgICAgcGNoID0gYygyMCwyMCwyMCksIGJ0eSA9ICJuIiwgIHB0LmNleCA9IDEuNSwgY2V4ID0gMC44ICwgCiAgICAgdGV4dC5jb2wgPSAiYmxhY2siLCBob3JpeiA9IEZBTFNFLCBpbnNldCA9IGMoMC40LCAwLjEpKQpgYGAKCgoKYGBge3J9CiMgU3RvcmUgYW5hbHlzaXMgZGF0YQpmUGF0aCA8LSBzdHJfaW50ZXJwKCIuLi9kYXRhL3Byb2Nlc3NlZC9hbmFseXNpcy9UVDFfRHJpdmVfMV9QUC5jc3YiKQpkZnggPC0gZGZQUApkZnggPC0gY2JpbmQocGVyc29ucywgZGZ4KQpuYW1lcyhkZngpIDwtIGMoIlN1YmplY3QiLCBuYW1lcyhkZlBQKSkKd3JpdGUuY3N2KGRmeCwgZlBhdGgsIHJvdy5uYW1lcyA9IEYpCmBgYAoKCgo=